# -*- coding: latin-1 -*-
import os.path
from django.db import models
from decimal import *
from django.contrib.auth.models import *

class TicketCompra(models.Model):
	id_articulo = models.IntegerField()
	precio = models.IntegerField()
	articulo = models.CharField(max_length=80)

	def __unicode__(self):
		return self.articulo
	
class Banco(models.Model):
	nombre = models.CharField(max_length=50)

	def __unicode__(self):
		return self.nombre	


	class Meta:
		ordering = ['nombre']

class TipoTarjeta(models.Model):
	nombre = models.CharField(max_length=35)
	cantidad_digitos = models.IntegerField(null=True, blank=True)
	posibles_comienzos = models.CommaSeparatedIntegerField(max_length=30, null=True, blank=True)
	imagen = models.ImageField(null=True, upload_to="tarjetas/",  blank=True)

	def __unicode__(self):
		return self.nombre	

	def check_cantidad_digitos(self, nro):
		return len(str(nro)) == self.cantidad_digitos  or self.cantidad_digitos==0

	def check_comienzo(self, nro):
		error = ""
		ret = False
		if not self.posibles_comienzo:
			return True
		for n in self.posibles_comienzos.split(','):
			ret = ret or int(str(nro)[0:len(n)]) == int(n)
			error = error + str(nro)[0:len(n)] + "," + n + ","
	
		return ret

class Tarjeta(models.Model):
	tipo = models.ForeignKey(TipoTarjeta)
	numero = models.CharField(max_length=18)
	vencimiento = models.DateField()

	def __unicode__(self):
		return self.tipo.nombre + " " + str(self.id)
	
class CuentaBancaria(models.Model):
	tipo = models.CharField(max_length=2, choices=(('CA','Caja de ahorro'),('CC','Cuenta corriente')),blank=True, null=True)
	banco = models.ForeignKey(Banco, blank=True, null=True)	
	numero = models.CharField("Número de Cuenta", max_length=22, blank=True,null=True)
	cbu = models.CharField("CBU", max_length=22, null=True,blank=True)

	def __unicode__(self):
		return u"%s: %s %s" % (self.banco, self.tipo, self.numero)
	
	class Meta:
		ordering = ['banco__nombre']

class FormaDePago(models.Model):
	fecha = models.DateField()
#user = models.ForeignKey(User)
	es_ingreso = models.BooleanField()
	efectivo = models.DecimalField(decimal_places=2,max_digits=10, null=True, blank=True)
	
	def total(self):
		res = self.efectivo
		if res ==None: res = Decimal(0)
		for c in self.cheques.all():
			res += c.importe
		for m in self.movimientos_bancarios.all():
			res += m.importe
		return res

	def signo(self):
		if self.es_ingreso:
			return 1
		else:
			return -1
			
	def efectivo_con_signo(self):
		return self.efectivo * self.signo()
	efectivo_con_signo.short_description= "Efectivo"

	
class ChequeDeTercero(models.Model):
	banco = models.ForeignKey(Banco)
	numero = models.CharField(max_length=50, null=True, blank=True)
	vencimiento = models.DateField(null=True, blank=True)
	importe = models.DecimalField(decimal_places = 2, max_digits=10)

	def ingresos(self):
		return self.movimientos.filter(formapago__es_ingreso=True)
	
	def egresos(self):
		return self.movimientos.filter(formapago__es_ingreso=False)
	
	def fecha(self):
		if self.ingresos():
			return self.ingresos()[0].fecha
		
	def en_cartera(self):
		return self.ingresos() and not self.egresos()

	def __unicode__(self):
		return self.numero

	class Meta:
		ordering = ['vencimiento','numero']
				

class MovimientoCheque(models.Model):
	formapago = models.ForeignKey(FormaDePago, related_name="cheques")
	cheque = models.ForeignKey(ChequeDeTercero, related_name="movimientos")

	@property
	def importe(self):
		return self.cheque.importe
                     
	def __unicode__(self):
		return self.cheque.numero
	
class MovimientoCuenta(models.Model):
	formapago = models.ForeignKey(FormaDePago, related_name="movimientos_bancarios")
	cuenta = models.ForeignKey(CuentaBancaria, related_name="movimientos")
	comprobante = models.CharField(max_length=50, null=True, blank=True)
	vencimiento = models.DateField(null=True, blank=True)
	importe = models.DecimalField(decimal_places = 2, max_digits=10)

	def fecha(self):
		return self.formapago.fecha
		
	def tipo(self):
		if self.formapago.es_ingreso:
			return "Crédito"
		else:
			return "Débito"
	
	def importe_con_signo(self):
		return self.importe * self.formapago.signo()
	importe_con_signo.short_description= "Importe"
	

class RubroCuenta(models.Model):
	nombre = models.CharField(max_length=50)

	def __unicode__(self):
		return self.nombre	


	class Meta:
		ordering = ['nombre']
	
class Cuenta(models.Model):
	rubro = models.ForeignKey(RubroCuenta)
	nombre = models.CharField(max_length=50)

	def __unicode__(self):
		return self.nombre	


	class Meta:
		ordering = ['nombre']
	

class Gasto(FormaDePago):
	cuenta = models.ForeignKey(Cuenta)
	concepto = models.CharField(max_length=55, blank=True, null=True)
	comprobante = models.CharField(max_length=20, blank=True, null=True)

	def __init__(self, *args, **kwargs):
		super(Gasto, self).__init__(*args, **kwargs)
		self.es_ingreso = False

	def __unicode__(self):
		return self.cuenta.nombre

	class Meta:
		ordering = ["-fecha"]
